iT邦幫忙

2021 iThome 鐵人賽

DAY 12
0
IT管理

Rocky Linux 8:系統管理與維運實戰系列 第 12

第10-1章:監控與管理作業系統上之程序(一)

  • 分享至 

  • xImage
  •  

前言

在上一章節中,介紹了檔案與目錄之使用者權限控管與管理,在這一章節中,將要介紹作業系統上的程序管理(process)。

Process之定義

一個Process程序包含相關的要素如下:

  • 給定一個分配好的記憶體當作空間位址供此運行的Process使用。
  • 安全設定機制包含了擁有者的認證與權限。
  • 一個或是多個程式碼之執行緒在運行。
  • 有程序的狀態(Process state)。

在作業系統環境上的Process包含之要素如下:

  • 本地與全域之變數。
  • 正在安排要執行的行文(context)。
  • 配置系統資源,像是檔案描述符(指向檔案的參照)與網路的埠號(Network ports)。

描述Process狀態

整個作業系統啟動並載入的時候會有一個main process,即主要的程序,叫做systemd,當其他的程序要啟動的時候,systemd便會fork一個process出來運行指定的程式,當這個程序還沒做完,再放到佇列中等待並休眠(sleeping),接著讓下一個程序可以運行,並這樣不斷的循環下去,直到作業系統重新開啟或關機為止,相關的示意圖如下:

Process佇列管理

那Linux之程序狀態有那些呢?相關的狀態清單如下:

  • Running之Flag表示成:R,指的是Process程序的任務正在運行中,CPU正為了這個任務正在運作。
  • Sleeping之Flag為S的時候,指的是Process程序任務為中斷的,這個程序正在等待某個條件,如硬體的請求、系統資源存取或是訊號,當上述的條件滿足的時候,則Process狀態又會切換成Running。
  • Sleeping之Flag為D的時候,指的是Process正在睡覺(sleeping),與S狀態不同的是,這個狀態不會回應任何的訊號,這個狀態只會在這個當程序中斷的時候,可能是成無法預期的裝置狀態所造成的。
  • Sleeping之Flag為K的時候,指的是這個程序任務已經被砍掉了,這是因為在D狀態的時候收到signal訊號表示要砍掉因此變成這個狀態。
  • Sleeping之Flag為I的時候,是D狀態中的其中一種,與D狀態的行為類似。
  • Stopped之Flag為T的時候,為T狀態,這程序可以被除錯,為debug狀態,為暫時性的停止。
  • Zombie之Flag有Z與X兩個狀態,X狀態是當程序結束的瞬間會變成此狀態,這兩個狀態都無法作處理,只能等到機器重開機或是自己消失不見。

為什麼Process狀態是很重要的?

因為在作業系統中,監控每個Process是可以觀察出資源使用,還有哪個Process有問題,吃很多的資源等,而可以使用top這個指令來即時的監控目前作業系統上每個正在運作的Process之狀態,相關的指令執行後輸出的訊息如下:

[rockylinux@workstation ~]$ top
top - 00:53:36 up  3:28,  1 user,  load average: 0.00, 0.00, 0.00
Tasks: 176 total,   1 running, 175 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.6 us,  7.9 sy,  0.0 ni, 89.5 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
MiB Mem :   1817.1 total,    660.8 free,    535.7 used,    620.6 buff/cache
MiB Swap:   2108.0 total,   2108.0 free,      0.0 used.   1124.7 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
   4177 rockyli+  20   0   65428   4520   3880 R   5.6   0.2   0:00.03 top
      1 root      20   0  186872  14524   9556 S   0.0   0.8   0:03.55 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kthreadd
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
      6 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri
      8 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 mm_percpu_wq
      9 root      20   0       0      0      0 S   0.0   0.0   0:00.03 ksoftirqd/0
     10 root      20   0       0      0      0 I   0.0   0.0   0:00.27 rcu_sched
     11 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration/0
     12 root      rt   0       0      0      0 S   0.0   0.0   0:00.01 watchdog/0
     13 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
     14 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1
     15 root      rt   0       0      0      0 S   0.0   0.0   0:00.01 watchdog/1
     16 root      rt   0       0      0      0 S   0.0   0.0   0:00.00 migration/1
     17 root      20   0       0      0      0 S   0.0   0.0   0:00.11 ksoftirqd/1
     19 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/1:0H-events_highpri
     21 root      20   0       0      0      0 I   0.0   0.0   0:00.13 kworker/u4:1-events_unbound
     22 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kdevtmpfs
     23 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 netns
     24 root      20   0       0      0      0 S   0.0   0.0   0:00.00 kauditd
......

或者是可以使用ps aux指令來看到此作業系統上之process程序的瞬間狀態,相關的執行指令輸出的訊息如下:

[rockylinux@workstation ~]$ ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.7 186872 14524 ?        Ss   Sep27   0:03 /usr/lib/systemd/systemd --switched-root
root           2  0.0  0.0      0     0 ?        S    Sep27   0:00 [kthreadd]
root           3  0.0  0.0      0     0 ?        I<   Sep27   0:00 [rcu_gp]
root           4  0.0  0.0      0     0 ?        I<   Sep27   0:00 [rcu_par_gp]
root           6  0.0  0.0      0     0 ?        I<   Sep27   0:00 [kworker/0:0H-events_highpri]
root           8  0.0  0.0      0     0 ?        I<   Sep27   0:00 [mm_percpu_wq]
root           9  0.0  0.0      0     0 ?        S    Sep27   0:00 [ksoftirqd/0]
root          10  0.0  0.0      0     0 ?        I    Sep27   0:00 [rcu_sched]
root          11  0.0  0.0      0     0 ?        S    Sep27   0:00 [migration/0]
root          12  0.0  0.0      0     0 ?        S    Sep27   0:00 [watchdog/0]
......

ps指令未帶參數執行的話,則會將目前Shell所有底下正在執行的程式都印出,有時候,Prcoess名稱會太長,導致終端機輸出的訊息不完整,且被截斷,為了要避免這件事情,可以加上w參數讓被截斷的訊息可以自動換行並印出。

工作與工作階段介紹

正在運行的工作就被稱為:Process程序,而程序可以分成在前景與背景執行,在前景執行就是在終端機上面執行一個指令,等到這個指令運作完成與結束之後,才可以繼續執行其他的指令,而背景就不一樣了,當Process放到背景中去執行的時候,則終端機可以繼續執行下一個指令,不需要等待。

相關的指令演示與輸出的訊息如下:

[rockylinux@workstation ~]$ sleep 100

當執行上述的指令的時候,需要等待sleep指令完成,即等待100秒之後,終端機才會回復並執行下一個指令,若是改成在背景執行,則可以在指令的後面加上&即可,相關的指令執行輸出訊息如下:

[rockylinux@workstation ~]$ sleep 100 &
[1] 4459
[rockylinux@workstation ~]$ jobs
[1]+  Running                 sleep 100 &
[rockylinux@workstation ~]$

當在背景執行的時候,會輸出一個Process id,利用jobs指令則可以看到目前在這個終端機上運行在背景的Process有哪一些,若要將背景的工作較回到前景也是可以的,利用fg指令便可以達到,假設要將上述放在背景中運行的sleep 100叫回到前景,可以看到這個背景Process運行的編號是1,即[1]+,則執行fg %1即可,相關的指令執行輸出的訊息如下:

[rockylinux@workstation ~]$ fg %1
sleep 100

當背景工作結束的時候,有時按下enter鍵,則會跳出下列的訊息,則表示編號為1的背景工作已經結束了,相關的指令執行輸出的訊息如下:

[rockylinux@workstation ~]$
[1]+  Done                    sleep 100

若要將被叫回前景的Process再次回到背景,則可以使用bg這個指令,操作的流程如下:

  • 先執行sleep 100 &指令。
  • 假設上述供作編號為1,則執行fg %1
  • 接著使用「ctrl」+「Z」鍵將當前的前景工作停止。
  • 使用jobs -l觀看目前在背景工作的清單與狀態。
  • 接著執行bg %1
  • 再使用jobs -l觀看目前在背景工作的清單與狀態。
[rockylinux@workstation ~]$ jobs -l
[rockylinux@workstation ~]$ sleep 100
^Z
[1]+  Stopped                 sleep 100
[rockylinux@workstation ~]$ jobs -l
[1]+  5805 Stopped                 sleep 100
[rockylinux@workstation ~]$
[rockylinux@workstation ~]$ bg %1
[1]+ sleep 100 &
[rockylinux@workstation ~]$ jobs -l
[1]+  5805 Running                 sleep 100 &
[rockylinux@workstation ~]$

課後練習

  • 請開啟workstation虛擬機器,並使用rockylinux之使用者登入桌面環境,並開啟終端機。
  • 執行sleep 90在前景,接著試著讓其中斷。
  • 試著找到上述中斷的工作並試著切換成運行的狀態。

上一篇
第9章:操作目錄與檔案權限介紹
下一篇
第10-2章:監控與管理作業系統上之程序(二)
系列文
Rocky Linux 8:系統管理與維運實戰23
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言